package chenlong.matrixtestdemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    //这个demo很好的诠释了mapPoints方法的妙用


    //注意 set pre post 三个方法是不存在所谓的队列前后之分的（网上有些帖子描述的有错误）
    //set 方法 先将矩阵重置 然后在设置值
    //pre 方法是相当于矩阵的前乘
    //post方法是相当于矩阵的后乘

    private MyImageView imageView;
    private Matrix matrix = new Matrix();
    private float[] src = new float[10];
    private float[] dst = new float[10];
    private RectF rectFsrc;
    private RectF rectFdst = new RectF();

    private float d = 1f;
    private float r = 0f;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (MyImageView) findViewById(R.id.imageView);
        final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a);
        final float px = bitmap.getWidth();
        final float py = bitmap.getHeight();
        src = new float[]{0, 0, px, 0, px, py, 0, py, px / 2, py / 2};
        rectFsrc = new RectF(0, 0, px, py);
        imageView.setImageBitmap(bitmap);
        imageView.setImageMatrix(matrix);
        findViewById(R.id.btn_move).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matrix.mapPoints(dst, src);
                matrix.postTranslate(30f, 30f);
                imageView.setImageMatrix(matrix);

                matrix.mapRect(rectFdst, rectFsrc);
                imageView.setRectF(rectFdst);
                imageView.invalidate();
                /**
                 *典型的移位运算直接postTranslate
                 */
            }
        });

        findViewById(R.id.btn_rotate).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matrix.mapPoints(dst, src);
                matrix.postRotate(5f, dst[8], dst[9]);
                imageView.setImageMatrix(matrix);

                matrix.mapRect(rectFdst, rectFsrc);
                imageView.setRectF(rectFdst);
                imageView.invalidate();

                /**
                 *中心旋转的第一个方法
                 *通过mapPoints 将原始的矩阵数据写入2D点 然后从2D点钟获取上次变换后的中心点位置
                 */
            }
        });
        findViewById(R.id.btn_rotate2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matrix.postTranslate(-px / 2, -py / 2);
                matrix.postRotate(5f);
                matrix.postTranslate(px / 2, py / 2);
                imageView.setImageMatrix(matrix);
                /**
                 *中心旋转的第二个方法 不需要知道旋转的中心点
                 * 1：因为矩阵的旋转是以（0，0）点为默认点 因此先将矩阵移动到 中心点对应（0，0）点
                 * 2：完成旋转
                 * 3：旋转完成之后 再移动回原始点
                 *
                 * 使用这种方式的时候 一定要注意操作的顺序 一定是先移动矩阵到（0，0）点 然后在旋转
                 * 三个步骤是不能调换的
                 */
            }
        });
        findViewById(R.id.btn_rotate3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                r = r + 5f;
                matrix.setRotate(r);
                matrix.preTranslate(-px / 2, -py / 2);
                matrix.postTranslate(px / 2, py / 2);
                imageView.setImageMatrix(matrix);

                //or
                //matrix.setRotate(r);
                //matrix.postTranslate(px / 2, py / 2);
                //matrix.preTranslate(-px / 2, -py / 2);
                //imageView.setImageMatrix(matrix);


                /**
                 *中心旋转的第三种方法
                 * 1：setRotate 因为setRotate 方法设置完成之后 矩阵会先被重置 在设置值 因此要完成持续旋转 需要单独设置一个累加的值
                 * 2：矩阵前乘移动负中心点
                 * 3：矩阵后乘移动正中心点
                 * 注意最后两部其实是可以互换位置的
                 * 但是一定是先旋转 旋转之后 在前乘和后乘
                 * 通过计算发现 前乘Translate的过程会自动结合当前scale进行换算移动的数据 保证前乘过Translate后 图片中心点对应（0，0）点
                 * 比如一个图片的中心点是（100，100）scale 0.5之后 仍然以（100，100）的中心点进行前乘Translate  那么实际上移动的距离是100*0.5
                 *
            */
            }
        });
        findViewById(R.id.btn_scale).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matrix.mapPoints(dst, src);
                matrix.postScale(0.9f, 0.9f, dst[8], dst[9]);
                matrix.mapRect(rectFdst, rectFsrc);
                imageView.setImageMatrix(matrix);
                imageView.setRectF(rectFdst);
                imageView.invalidate();
                /**
                 *
                 */
            }
        });

        findViewById(R.id.btn_scale2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                d = d - 0.1f;
                matrix.reset();
                matrix.postTranslate(-px / 2, -py / 2);
                matrix.postScale(d, d);
                matrix.postTranslate(px / 2, py / 2);
                imageView.setImageMatrix(matrix);
                /**
                 *
                 */
            }
        });

        findViewById(R.id.btn_scale3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                d = d - 0.1f;
                matrix.setScale(d, d);
                matrix.postTranslate(px / 2, py / 2);
                matrix.preTranslate(-px / 2, -py / 2);
                imageView.setImageMatrix(matrix);
                /**
                 *
                 */
            }
        });
        findViewById(R.id.btn_reset).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                d = 1f;
                r = 0f;
                matrix.reset();
                matrix.mapPoints(dst, src);
                matrix.mapRect(rectFdst, rectFsrc);
                imageView.setRectF(rectFdst);
                imageView.setImageMatrix(matrix);
                imageView.invalidate();
                /**
                 *
                 */
            }
        });
    }
}
